package com.kxr.day09.webmagic.pageProcessor;

import com.kxr.day09.utils.DateUtils;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.ResultItems;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.processor.PageProcessor;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 实现一下PageProcess的接口
 */
public class XLNBAPageProcessor implements PageProcessor {
    // 发送请求的基本配置，失败重试3次， 睡眠时间1s ， 超时时间10秒
    private Site site = Site.me().setRetryTimes(3).setSleepTime(1000).setTimeOut(10 * 1000);

    @Override
    public void process(Page page) {

        // 1. 提取网站的数据
        // 2. 发现新的链接

        // 正则分析，哪些界面是列表界面，哪些是详情界面
        // 详情页的规律： https://sports.sina.com.cn/basketball/nba/日期字符/随机字符.shtml
        // 正则表达式？
        //      正则表达式里.是什么意思，匹配任意字符，.是关键字，需要对它进行转意
        //      [] 代表括号里的任何一个字符都可以
        //      \w 代表文本内容[A-Za-z0-9]
        //      - 固定文本
        //      * 代表前面的可以出现任意次
        //      [\w-]*代表这里可以由字符和-组成，可以出现任意个满足条件的内容
        //  日期可以直接在这放置一个任意字符
        // https://sports\.sina\.com\.cn/basketball/nba/[\w-]*/[\w-]*\.shtml
        String reg = "https://sports\\.sina\\.com\\.cn/basketball/nba/[\\w-]*/[\\w-]*\\.shtml";
        // 这个代表这是一个详情界面
        if (page.getUrl().regex(reg).match()) {
            // 详情界面包含内容的界面，是需要提取内容，并且交给pipiline处理的
            // 怎么处理数据,提取到标题的数据
            String title = page.getHtml().xpath("//h1[@class='main-title']/text()").get();
            // id为top_bar的div元素下的class为date的span标签下的文本
            String timeStr = page.getHtml().xpath("//div[@id='top_bar']//span[@class='date']/text()").get();
            // id为artibody下的文本 smartContent 获取富文本内容
            String content = page.getHtml().xpath("//div[@id='artibody']").smartContent().get();
            String contentHtml = page.getHtml().xpath("//div[@id='artibody']").get();
            // id 为top_bar 下的a标签并样式为source的元素文本,换一种方式，用css选择器的方式
            //  xpath 怎么写
//            String author = page.getHtml().xpath("//div[@id='top_bar']//a[@class='source']/text()").get();
            // css选择器怎么写
            String author = page.getHtml().css("#top_bar .source").xpath("/a/text()").get();
            // 把数据设置到items里，之后，webmagic就会把数据交给pipiline
            ResultItems resultItems = page.getResultItems();
            resultItems.put("title", title);

            resultItems.put("time", DateUtils.parseTimestamp(timeStr,"yyyy年MM月dd日 hh:mm"));

            resultItems.put("content", content);
            resultItems.put("contentHtml", contentHtml);
            resultItems.put("category", "nba");
            resultItems.put("source", "新浪");
            resultItems.put("author", author);
        }else {
            // 其它界面代表可能列表界面，用于发现新的链接
            // 代表这个链接不会被pipiline处理
            page.setSkip(true);
        }

        // 发现新的链接
        // links() 获取所有的a标签,获取这个网站所有的满足我们详情页面正则的标签
        page.addTargetRequests(page.getHtml().links().regex(reg).all());
    }

    @Override
    public Site getSite() {
        // 网站的配置
        return site;
    }


}
